package com.amado.course50java8;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;

public class Java803LambdasForEach {
	public static void main(String[] args) {
		foreach();
		thread();
		sort();
	}

	private static void foreach() {
		// java 7
		List<String> list = Arrays.asList("a", "b", "d");
		for (String str : list) {
			System.out.print(str + "\t");
		}
		// java 8匿名类
		Arrays.asList("a", "b", "d").forEach(new Consumer<String>() {
			@Override
			public void accept(String t) {
				System.out.print(t + "\t");
			}
		});
		System.out.println();
		// java 8 lambda,前提条件必须为@FunctionalInterface（函数接口）申明的类
		// 只有一个参数可以不需要()
		Arrays.asList("a", "b", "d").forEach(e -> System.out.print(e + "\t"));
		// 与上面等同
		Arrays.asList("a", "b", "d").forEach((e) -> System.out.print(e + "\t"));
		
		List<String> stringArray = Arrays.asList(new String[] {"a","b","c"});
		stringArray.forEach((e)->System.out.println(e));
		
		stringArray.forEach(System.out::println);
	}

	public static void thread() {
		// java 7
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("come");
				System.out.println("come");
				System.out.println("come");
			}
		}).start();
		// java 8 run方法没有参数
		new Thread(() -> System.out.println("come")).start();
		new Thread(() -> {
			System.out.println("come");
			System.out.println("come");
			System.out.println("come");
		}).start();
	}

	public static void sort() {
		// java 8 匿名类
		Arrays.asList("a", "b", "d").sort(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
		});
		// 如果抽象方法有多个参数，多个参数用（）括起来,，int compare(T o1, T o2);
		// 缺省值是不需要return的
		// e1,e2是参数
		// Lambda可能会返回一个值。返回值的类型也是由编译器推测出来的。如果lambda的函数体只有一行的话，那么没有必要显式使用return语句。下面两个代码片段是等价的：
		Arrays.asList("a", "b", "d").sort((e1, e2) -> e1.compareTo(e2));
		Arrays.asList("a", "b", "d").sort((e1, e2) -> {
			return e1.compareTo(e2);
		});
		// 方法引用
		Arrays.asList("a", "b", "d").sort(String::compareTo);
	}
}
